home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc Development Framework / ODFDev / ODF / Found / FWDebug / Sources / FWSymFil.cpp < prev   
Encoding:
Text File  |  1995-11-08  |  9.2 KB  |  365 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWSymFil.cpp
  4. //    Release Version:    $ 1.0d11 $
  5. //
  6. //    Copyright:    (c) 1993, 1995 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFound.hpp"
  11.  
  12. #ifdef FW_BUILDWIN
  13.  
  14. #include <Windows.h>
  15. #include <ToolHelp.h>
  16.  
  17. #ifndef FWSYMFIL_H
  18. #include "FWSymFil.h"
  19. #endif
  20.  
  21. #ifdef FW_DEBUG
  22.  
  23. #ifdef __ZTC__
  24. #include <HugePtr.h>
  25. #endif
  26.  
  27. #ifndef FWPRISTR_H
  28. #include "FWPriStr.h"
  29. #endif
  30.  
  31. #ifndef FWPRIMEM_H
  32. #include "FWPriMem.h"
  33. #endif
  34.  
  35. //========================================================================================
  36. // Local utility functions
  37. //========================================================================================
  38.  
  39. // Private data structures: correspond to Windows format .SYM files
  40.  
  41. struct MAPDEF
  42. {
  43.     WORD ppNextMap;
  44.     BYTE bFlags;
  45.     BYTE bReserved1;
  46.     WORD pSegEntry;
  47.     WORD cConsts;
  48.     WORD pConstDef;
  49.     WORD cSegs;
  50.     WORD ppSegDef;
  51.     BYTE cbMaxSym;
  52.     BYTE cbModName;
  53.     char achModName[1];
  54. };
  55.  
  56. struct SEGDEF
  57. {
  58.     WORD ppNextSeg;
  59.     WORD cSymbols;
  60.     WORD pSymDef;
  61.     WORD wSeg;          // Segment paragraph
  62.     WORD wReserved2;
  63.     WORD wReserved3;
  64.     WORD wReserved4;
  65.     BYTE bFlags;
  66.     BYTE bReserved1;
  67.     WORD ppLineDef;
  68.     BYTE bReserved2;
  69.     BYTE bReserved3;
  70.     BYTE cbSegName;
  71.     char achSegName[1];
  72. };
  73.  
  74. struct SYMDEF
  75. {
  76.     WORD wSymVal;
  77.     BYTE cbSymName;
  78.     char achSymName[1];
  79. };
  80.  
  81. #define STACK_PROLOGUE_THRESHOLD 20
  82.  
  83.  
  84. //----------------------------------------------------------------------------------------
  85. // SymFindSegment
  86. //----------------------------------------------------------------------------------------
  87.  
  88. static SEGDEF* SymFindSegment(void* pData,
  89.                               WORD wSeg)
  90. {
  91. #ifdef FW_BUILD_WIN16
  92.  
  93.     MAPDEF * pMapDef = (MAPDEF *)pData;
  94.     SEGDEF * pSegDef = (SEGDEF *)((LPSTR)pData + (pMapDef->ppSegDef * 16));
  95.     WORD cSegs = pMapDef->cSegs;
  96.  
  97.     while (cSegs-- > 0)
  98.     {
  99.         if (pSegDef->cbSegName > 50)
  100.             return NULL;
  101.  
  102.         if (pSegDef->wSeg == wSeg)
  103.             return pSegDef;
  104. #ifdef __ZTC__
  105.         pSegDef = hugeptr_add((char*)pData, ((long)pSegDef->ppNextSeg) * 16L);
  106. #else
  107.         pSegDef = (SEGDEF *) ((char huge*)pData + ((DWORD)pSegDef->ppNextSeg * 16));
  108. #endif
  109.  
  110.     }
  111. #endif
  112.     return NULL;
  113. }
  114.  
  115.  
  116. //----------------------------------------------------------------------------------------
  117. // SymFindSymbol
  118. //----------------------------------------------------------------------------------------
  119.  
  120. static SYMDEF* SymFindSymbol(SEGDEF* pSegDef,
  121.                              WORD fOffset)
  122. {
  123. #ifdef FW_BUILD_WIN16
  124.     WORD * aSymPtr = (WORD *) ((BYTE *)pSegDef + pSegDef->pSymDef);
  125.     SYMDEF * pSymDef;
  126.     WORD wSymVal;
  127.     WORD i;
  128.  
  129.     for (i = 0; i < pSegDef->cSymbols; i++)
  130.     {
  131.         pSymDef = (SYMDEF *)((BYTE *)pSegDef + aSymPtr[i]);
  132.  
  133.         wSymVal = pSymDef->wSymVal;
  134.  
  135.         if (wSymVal > fOffset)
  136.             return NULL;
  137.         else if (wSymVal + STACK_PROLOGUE_THRESHOLD > fOffset)
  138.             return pSymDef;
  139.     }
  140. #endif
  141.     return NULL;
  142. }
  143.  
  144.  
  145. //----------------------------------------------------------------------------------------
  146. // SymFindAddress
  147. //----------------------------------------------------------------------------------------
  148.  
  149. static FW_Boolean SymFindAddress(void* pSymData,
  150.                                  WORD wSeg,
  151.                                  WORD fOffset,
  152.                                  BYTE cbMaxLen,
  153.                                  char* pzName)
  154. {
  155. #ifdef FW_BUILD_WIN16
  156.     SEGDEF * pSegDef = SymFindSegment(pSymData, wSeg);
  157.     SYMDEF * pSymDef = NULL;
  158.     WORD cbCopy;
  159.  
  160.     if (pSegDef != NULL)
  161.         pSymDef = SymFindSymbol(pSegDef, fOffset);
  162.  
  163.     if (pSymDef != NULL)
  164.     {
  165.         cbCopy = FW_Minimum((BYTE)(cbMaxLen - 1), pSymDef->cbSymName);
  166.         FW_PrimitiveCopyMemory(pzName, pSymDef->achSymName, cbCopy);
  167.         pzName[cbCopy] = 0;
  168.     }
  169.  
  170.     return pSymDef != NULL;
  171. #else
  172.     return FALSE;
  173. #endif
  174. }
  175.  
  176.  
  177. //========================================================================================
  178. // Class FW_CPrivWinSymFile
  179. //========================================================================================
  180.  
  181. //----------------------------------------------------------------------------------------
  182. // FW_CPrivWinSymFile::FW_CPrivWinSymFile
  183. //----------------------------------------------------------------------------------------
  184.  
  185. FW_CPrivWinSymFile::FW_CPrivWinSymFile(const char* pzFileName) :
  186.     fSymData(NULL)
  187. {
  188. #ifdef FW_BUILD_WIN16
  189.     HFILE hFile = ::_lopen(pzFileName, READ);
  190.     if (hFile != HFILE_ERROR)
  191.     {
  192.         long cbFileSize = ::_llseek(hFile, 0l, SEEK_END);
  193.         ::_llseek(hFile, 0l, SEEK_SET);
  194.  
  195. //        FW_ASSERT(cbFileSize < 0x10000L);
  196.         fSymData = new char[(unsigned short) cbFileSize];
  197.         if (fSymData != NULL)
  198.             ::_hread(hFile, fSymData, cbFileSize);
  199.  
  200.         ::_lclose(hFile);
  201.     }
  202. #endif
  203. }
  204.  
  205. //----------------------------------------------------------------------------------------
  206. // FW_CPrivWinSymFile::~FW_CPrivWinSymFile
  207. //----------------------------------------------------------------------------------------
  208.  
  209. FW_CPrivWinSymFile::~FW_CPrivWinSymFile(void)
  210. {
  211. #ifdef FW_BUILD_WIN16
  212.     delete[] fSymData;
  213. #endif
  214. }
  215.  
  216. //----------------------------------------------------------------------------------------
  217. // FW_CPrivWinSymFile::FindSymbol
  218. //----------------------------------------------------------------------------------------
  219.  
  220. FW_Boolean FW_CPrivWinSymFile::FindSymbol(unsigned short wSeg,
  221.                                          unsigned short fOffset,
  222.                                          unsigned short cbMaxLen,
  223.                                          char* pzName)
  224. {
  225. #ifdef FW_BUILD_WIN16
  226.  
  227.     if (fSymData != NULL)
  228.         return SymFindAddress(fSymData, wSeg, fOffset, cbMaxLen, pzName);
  229. #endif
  230.  
  231.     return NULL;
  232. }
  233.  
  234.  
  235. //========================================================================================
  236. // CLASS FW_CPrivWinDebugModuleList
  237. //========================================================================================
  238.  
  239. FW_CPrivWinDebugModuleList::sOneModule FW_CPrivWinDebugModuleList::fModules[FW_CPrivWinDebugModuleList::kMaxModules];
  240. unsigned short FW_CPrivWinDebugModuleList::fNumberOfModules = 0;
  241.  
  242. //----------------------------------------------------------------------------------------
  243. // FW_CPrivWinDebugModuleList::Initialize
  244. //----------------------------------------------------------------------------------------
  245.  
  246. void FW_CPrivWinDebugModuleList::Initialize(void)
  247. {
  248.     fNumberOfModules = 0;
  249. }
  250.  
  251. //----------------------------------------------------------------------------------------
  252. // FW_CPrivWinDebugModuleList::Terminate
  253. //----------------------------------------------------------------------------------------
  254.  
  255. void FW_CPrivWinDebugModuleList::Terminate(void)
  256. {
  257. #ifdef FW_BUILD_WIN16
  258.  
  259.     for (unsigned short i = 0; i < fNumberOfModules; i++)
  260.     {
  261.         delete fModules[i].fSymFile;
  262.         
  263.         fModules[i].fSymFile = NULL;
  264.         fModules[i].fModule = 0;
  265.     }
  266.     
  267.     fNumberOfModules = 0;
  268. #endif
  269. }
  270.  
  271. //----------------------------------------------------------------------------------------
  272. // FW_CPrivWinDebugModuleList::FindSymbol
  273. //----------------------------------------------------------------------------------------
  274.  
  275. FW_Boolean FW_CPrivWinDebugModuleList::FindSymbol(HANDLE fModule,
  276.                                                  unsigned short wSeg,
  277.                                                  unsigned short fOffset,
  278.                                                  unsigned short cbMaxLen,
  279.                                                  char* pzName)
  280. {
  281. #ifdef FW_BUILD_WIN16
  282.  
  283.     unsigned short i = FindModule(fModule);
  284.     if (i != kModuleNotFound)
  285.         return fModules[i].fSymFile->FindSymbol(wSeg, fOffset, cbMaxLen, pzName);
  286.  
  287. #endif
  288.     return FALSE;
  289. }
  290.  
  291.  
  292. //----------------------------------------------------------------------------------------
  293. // FW_CPrivWinDebugModuleList::GetModuleName
  294. //----------------------------------------------------------------------------------------
  295.  
  296. FW_Boolean FW_CPrivWinDebugModuleList::GetModuleName(HANDLE fModule,
  297.                                      char* pzName)
  298. {
  299. #ifdef FW_BUILD_WIN16
  300.     unsigned short i = FindModule(fModule);
  301.     if (i != kModuleNotFound)
  302.     {
  303.         FW_PrimitiveStringCopy(fModules[i].fModuleName, pzName);
  304.         return TRUE;
  305.     }
  306. #endif
  307.     return FALSE;
  308. }
  309.  
  310. //----------------------------------------------------------------------------------------
  311. // FW_CPrivWinDebugModuleList::FindModule
  312. //----------------------------------------------------------------------------------------
  313.  
  314.  
  315. unsigned short FW_CPrivWinDebugModuleList::FindModule(HANDLE fModule)
  316. {
  317. #ifdef FW_BUILD_WIN16
  318.     for (unsigned short i = 0; i < fNumberOfModules; i++)
  319.         if (fModules[i].fModule == fModule)
  320.             return i;
  321.  
  322.     return AddModule(fModule);
  323. #else
  324.     return 0;
  325. #endif
  326. }
  327.  
  328.  
  329. //----------------------------------------------------------------------------------------
  330. // FW_CPrivWinDebugModuleList::AddModule
  331. //----------------------------------------------------------------------------------------
  332.  
  333. unsigned short FW_CPrivWinDebugModuleList::AddModule(HANDLE fModule)
  334. {
  335. #ifdef FW_BUILD_WIN16
  336.     if (fNumberOfModules < kMaxModules)
  337.     {
  338.         // Get the module info from Windows
  339.         MODULEENTRY ModuleEntry;
  340.         ModuleEntry.dwSize = sizeof(MODULEENTRY);
  341.  
  342. #ifndef FW_BUILD_DOS
  343.         if (ModuleFindHandle(&ModuleEntry, fModule))
  344.         {
  345.             char zSymFileName[MAX_PATH + 1];
  346.  
  347.             FW_PrimitiveStringCopy(ModuleEntry.szExePath, zSymFileName);
  348.             FW_PrimitiveStringCopy(".SYM", FW_PrimitiveStringFindCharacter(zSymFileName, '.'));
  349.  
  350.             fModules[fNumberOfModules].fSymFile = new FW_CPrivWinSymFile(zSymFileName);
  351.             fModules[fNumberOfModules].fModule = fModule;
  352.             FW_PrimitiveStringCopy(ModuleEntry.szModule, fModules[fNumberOfModules].fModuleName);
  353.  
  354.             return fNumberOfModules++;
  355.         }
  356. #endif
  357.     }
  358. #endif
  359.     return kModuleNotFound;
  360. }
  361.  
  362. #endif // FW_DEBUG
  363. #endif // FW_BUILD_WIN
  364.  
  365.